package com.sojson.project.filedepot.task;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Conditional;
import org.springframework.stereotype.Component;

import com.sojson.config.condition.TaskCondition;
import com.sojson.constant.Constant;
import com.sojson.project.filedepot.entity.dto.FileDepotDto;
import com.sojson.project.filedepot.entity.dto.FileTableDto;
import com.sojson.project.filedepot.entity.vo.FileDepotVo;
import com.sojson.project.filedepot.entity.vo.FileTableVo;
import com.sojson.project.filedepot.service.FileDepotService;
import com.sojson.project.filedepot.service.FileTableService;
import com.sojson.task.TaskInterface;
import com.sojson.util.DateUtil;
import com.sojson.util.file.depot.FileDepotUtil;
import com.sojson.util.file.enums.EFileStatus;

import lombok.extern.slf4j.Slf4j;

/**
 * 文件管理系统定时任务
 *
 * @author liu
 * @date 2021-04-28
 */
@Slf4j
@Component
/** 是否注入这个Bean */
@Conditional(TaskCondition.class)
public class CustomFileDepotTask implements TaskInterface {

    @Autowired
    private FileDepotService imageService;
    @Autowired
    private FileTableService fileTableService;

    /** 文件创建后删除的超时时间 */
    private static final long IMG_CREATE_TIMEOUT = Constant.MILLIS_DAY / 1000;

    /**
     * 清空已删除的文件
     */
    public void clearFileDay() {
        log.info("---------------当天0 点 开始清空已删除的文件----------------");

        // 删除旧数据
        FileDepotDto fileDepot = new FileDepotDto();

        try {
            fileDepot.setStatus(EFileStatus.DELETE.getCode());
            int count = imageService.removeByDto(fileDepot);
            log.info("---------------删除: " + count + "条状态为已删除的旧文件数据----------------");
        } catch (Exception e) {
            log.error("删除已删除的旧文件数据失败，" + e.getMessage());
        }

        List<FileDepotVo> listPath = null;
        try {
            // 获取状态为未引用的文件
            fileDepot.setStatus(EFileStatus.USE_NO.getCode());
            listPath = imageService.listPath(fileDepot);
            FileDepotUtil.deleteFileList(listPath);
            log.info("---------------删除: " + listPath.size() + "个状态为未引用的文件----------------");
        } catch (Exception e) {
            log.error("删除状态为未引用的文件失败，" + e.getMessage());
        }

        try {
            // 获取状态为已创建超过24小时的文件
            fileDepot.setStatus(EFileStatus.CREATE.getCode());
            fileDepot.setThisDate(DateUtil.nowDate());
            fileDepot.setTimeout(IMG_CREATE_TIMEOUT);
            listPath = imageService.listPath(fileDepot);
            FileDepotUtil.deleteFileList(listPath);
            log.info("---------------清除: " + listPath.size() + "个状态为已创建超过24小时的文件----------------");
        } catch (Exception e) {
            log.error("删除状态为已创建超过24小时的文件失败，" + e.getMessage());
        }

        log.info("---------------当天0 点 清空已删除的文件结束----------------");
    }

    /**
     * 清空未引用的文件
     */
    public void clearFileMonth() {
        log.info("---------------当月1号0点 开始清空未引用的文件----------------");

        FileTableDto fileTableDto = new FileTableDto();
        fileTableDto.setParentId("0");
        List<FileTableVo> findTables = fileTableService.findTables(fileTableDto);
        List<FileDepotVo> pathList = null;
        boolean isIncludeOrderRelation = false;
        for (FileTableVo fileTable : findTables) {
            try {
                // 获取状态为未引用的文件
                pathList = imageService.getPathList(fileTable, isIncludeOrderRelation);
                FileDepotUtil.deleteFileList(pathList);
                log.info("---------------删除" + fileTable.getTableName() + "表: " + pathList.size()
                    + "个未引用的文件----------------");
            } catch (Exception e) {
                log.error("删除状态为使用中但是未引用的文件失败，" + e.getMessage());
                imageService.clearImgMonthWarn();
            }
        }

        log.info("---------------当月1号0点 清空未引用的文件结束----------------");
    }

    /**
     * 清空订单关联关系的文件
     */
    public void clearFileOrderRelation() {
        log.info("---------------当月1号0点 开始清空订单关联关系的文件----------------");

        FileTableDto fileTableDto = new FileTableDto();
        fileTableDto.setParentId("0");
        List<FileTableVo> findTables = fileTableService.findTables();
        List<FileDepotVo> pathList = null;
        for (FileTableVo fileTable : findTables) {
            try {
                // 获取状态为未引用的文件
                pathList = imageService.getOrderRelationPathList(fileTable);
                FileDepotUtil.deleteFileList(pathList);
                log.info("---------------删除" + fileTable.getTableName() + "表: " + pathList.size()
                    + "个订单关联关系的文件----------------");
            } catch (Exception e) {
                log.error("删除订单关联关系的文件失败，" + e.getMessage());
                imageService.clearImgMonthWarn();
            }
        }

        log.info("---------------当月1号0点 清空订单关联关系的文件结束----------------");
    }

}